<?php
/**
 * Created by PhpStorm.
 * User: yys
 * Date: 2016/11/14
 * Time: 14:39
 */

namespace App\Services\Tool\ImageProcessor;


class Imagick
{

    /**
     * @var \Imagick
     */
    private $image       = NULL;
    private $outputImage=NULL;
    private $originalImage=NULL;
    private $type = NULL;

    // 构造函数
    public function __construct($image = NULL,$outputImage=NULL)
    {
        if ($image) {
            $this->readImage($image);
        }
        $this->outputImage=$outputImage;
        $this->originalImage=$image;
    }

    /**
     * 载入图像
     *
     * @param string $image
     *
     * @return $this
     */
    public function readImage($image)
    {
        if (@is_file($image)) {
            $this->image = new \Imagick($image);
        } else {
            $this->image = new \Imagick();
            $this->image->readImageBlob($image);
        }

        $this->image->setInterlaceScheme(\Imagick::INTERLACE_PLANE);   //交错显示
        $this->type = strtolower($this->image->getImageFormat());
        $this->image->setImageUnits(\Imagick::RESOLUTION_PIXELSPERINCH);
        $this->setImageResolution(72,72);
        return $this;
    }

    public function getImagick(){
        return $this->image;
    }


    /**
     * 裁剪
     *
     * @param int $x
     * @param int $y
     * @param null $width
     * @param null $height
     */
    public function crop($x = 0, $y = 0, $width = NULL, $height = NULL)
    {
        if ($width == NULL) {
            $width = $this->image->getImageWidth() - $x;
        }
        if ($height == NULL) {
            $height = $this->image->getImageHeight() - $y;
        }
        if ($width <= 0 || $height <= 0) {
            return;
        }

        if ($this->type == 'gif') {
            $image = $this->image;
            $canvas = new \Imagick();

            $images = $image->coalesceImages();
            foreach ($images as $frame) {
                $img = new \Imagick();
                $img->readImageBlob($frame);
                $img->cropImage($width, $height, $x, $y);

                $canvas->addImage($img);
                $canvas->setImageDelay($img->getImageDelay());
                $canvas->setImagePage($width, $height, 0, 0);
            }

            $image->destroy();
            $this->image = $canvas;
        } else {
            $this->image->cropImage($width, $height, $x, $y);
        }
    }
    public function cropByCenter($width = NULL, $height = NULL)
    {
        //图原本的宽高
        $src_width= $this->image->getImageWidth();
        $src_height= $this->image->getImageHeight();
        $x=0;
        $y=0;
        if ($width == NULL) {
            $width = $this->image->getImageWidth() - $x;
        }
        if ($height == NULL) {
            $height = $this->image->getImageHeight() - $y;
        }
        if ($width <= 0 || $height <= 0) {
            return;
        }

        if ($this->type == 'gif') {
            $image = $this->image;
            $canvas = new \Imagick();

            $images = $image->coalesceImages();
            foreach ($images as $frame) {
                $img = new \Imagick();
                $img->readImageBlob($frame);
                $img->cropImage($width, $height, $x, $y);

                $canvas->addImage($img);
                $canvas->setImageDelay($img->getImageDelay());
                $canvas->setImagePage($width, $height, 0, 0);
            }

            $image->destroy();
            $this->image = $canvas;
        } else {
            $this->image->cropImage($width, $height, $x, $y);
        }
    }
    /**
     * 更改图像大小
     * $fit: 适应大小方式
     * 'force': 把图片强制变形成 $width X $height 大小
     * 'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height
     * 'scale_fill': 按比例在安全框 $width X $height 内缩放图片，安全框内没有像素的地方填充色,
     * 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明))
     * 其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小
     * $fit = 'force','scale','scale_fill' 时： 输出完整图像
     * $fit = 图像方位值 时, 输出指定位置部分图像
     * 字母与图像的对应关系如下:
     * north_west   north   north_east
     * west         center        east
     * south_west   south   south_east
     *
     * @param int $width
     * @param int $height
     * @param string $fit
     * @param array $fill_color
     * @return $this
     */
    public function resize($width = 100, $height = 100, $fit = 'center', $fill_color = array(255, 255, 255, 127))
    {
        $canvas = new \Imagick();
        $canvas->setInterlaceScheme(\Imagick::INTERLACE_PLANE);

        switch ($fit) {
            case 'force':
                if ($this->type == 'gif') {
                    $image = $this->image;

                    $images = $image->coalesceImages();
                    foreach ($images as $frame) {
                        $img = new \Imagick();
                        $img->readImageBlob($frame);
                        $img->thumbnailImage($width, $height, false);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                    }
                    $image->destroy();
                    $this->image = $canvas;
                } else {
                    $this->image->resizeImage($width, $height,\Imagick::FILTER_LANCZOS,1);
//                    $this->image->thumbnailImage($width, $height, false);
                }
                break;
            case 'scale':
                if ($this->type == 'gif') {
                    $image = $this->image;
                    $images = $image->coalesceImages();

                    foreach ($images as $frame) {
                        $img = new \Imagick();
                        $img->readImageBlob($frame);
                        $img->thumbnailImage($width, $height, true);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                    }
                    $image->destroy();
                    $this->image = $canvas;
                } else {
                    $this->image->thumbnailImage($width, $height, true);
                }
                break;
            case 'scale_fill':
                $size = $this->image->getImagePage();
                $src_width = $size['width'];
                $src_height = $size['height'];

                $x = 0;
                $y = 0;

                $dst_width = $width;
                $dst_height = $height;

                if ($src_width * $height > $src_height * $width) {
                    $dst_height = intval($width * $src_height / $src_width);
                    $y = intval(($height - $dst_height) / 2);
                } else {
                    $dst_width = intval($height * $src_width / $src_height);
                    $x = intval(($width - $dst_width) / 2);
                }

                $image = $this->image;

                $color = 'rgba(' . $fill_color[0] . ',' . $fill_color[1] . ',' . $fill_color[2] . ',' . $fill_color[3] . ')';
                if ($this->type == 'gif') {
                    $images = $image->coalesceImages();
                    foreach ($images as $frame) {
                        /**@var \Imagick $frame */
                        $frame->thumbnailImage($width, $height, true);

                        $draw = new \ImagickDraw();
                        $draw->composite($frame->getImageCompose(), $x, $y, $dst_width, $dst_height, $frame);

                        $img = new \Imagick();
                        $img->newImage($width, $height, $color, 'gif');
                        $img->drawImage($draw);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                        $canvas->setImagePage($width, $height, 0, 0);
                    }
                } else {
                    $image->thumbnailImage($width, $height, true);

                    $draw = new \ImagickDraw();
                    $draw->composite($image->getImageCompose(), $x, $y, $dst_width, $dst_height, $image);

                    $canvas->newImage($width, $height, $color, $this->getType());
                    $canvas->drawImage($draw);
                    $canvas->setImagePage($width, $height, 0, 0);
                }
                $image->destroy();
                $this->image = $canvas;
                break;
            default:
                $size = $this->image->getImagePage();
                $src_width = $size['width'];
                $src_height = $size['height'];
                $crop_y = $crop_x = 0;
                $crop_w = $src_width;
                $crop_h = $src_height;
                if ($src_width * $height > $src_height * $width) {
                    $crop_w = intval($src_height * $width / $height);
                } else {
                    $crop_h = intval($src_width * $height / $width);
                }
                switch ($fit) {
                    case 'north_west':
                        $crop_x = 0;
                        $crop_y = 0;
                        break;
                    case 'north':
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = 0;
                        break;
                    case 'north_east':
                        $crop_x = $src_width - $crop_w;
                        $crop_y = 0;
                        break;
                    case 'west':
                        $crop_x = 0;
                        $crop_y = intval(($src_height - $crop_h) / 2);
                        break;
                    case 'center':
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = intval(($src_height - $crop_h) / 2);
                        break;
                    case 'east':
                        $crop_x = $src_width - $crop_w;
                        $crop_y = intval(($src_height - $crop_h) / 2);
                        break;
                    case 'south_west':
                        $crop_x = 0;
                        $crop_y = $src_height - $crop_h;
                        break;
                    case 'south':
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = $src_height - $crop_h;
                        break;
                    case 'south_east':
                        $crop_x = $src_width - $crop_w;
                        $crop_y = $src_height - $crop_h;
                        break;
                    default:
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = intval(($src_height - $crop_h) / 2);
                }
                $image = $this->image;
                if ($this->type == 'gif') {
                    $images = $image->coalesceImages();
                    foreach ($images as $frame) {
                        $img = new \Imagick();
                        $img->readImageBlob($frame);
                        $img->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
                        $img->thumbnailImage($width, $height, true);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                        $canvas->setImagePage($width, $height, 0, 0);
                    }
                } else {
                    $image->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
                    $image->thumbnailImage($width, $height, true);
                    $canvas->addImage($image);
                    $canvas->setImagePage($width, $height, 0, 0);
                }
                $image->destroy();
                $this->image = $canvas;
        }
        return $this;
    }
    public function setImageResolution($dpi_x=72,$dpi_y=72){
        return $this->image->setImageResolution($dpi_x,$dpi_y);
    }
    /**
     *
     * @param string $fit
     * @param array $fill_color
     * @return $this
     */
    public function resizeByRatio($fit = 'center', $fill_color = array(255, 255, 255, 0))
    {
        $canvas = new \Imagick();
        $canvas->setInterlaceScheme(\Imagick::INTERLACE_PLANE);
        //原图尺寸
        $size = $this->image->getImagePage();
        $width = floor($size['width']);
        $height = floor($size['height']);
        switch ($fit) {
            case 'force':
                if ($this->type == 'gif') {
                    $image = $this->image;
                    $images = $image->coalesceImages();
                    foreach ($images as $frame) {
                        $img = new \Imagick();
                        $img->readImageBlob($frame);
                        $img->thumbnailImage($width, $height, false);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                    }
                    $image->destroy();
                    $this->image = $canvas;
                } else {
                    $this->image->thumbnailImage($width, $height, false);
                }
                break;
            case 'scale':
                if ($this->type == 'gif') {
                    $image = $this->image;
                    $images = $image->coalesceImages();

                    foreach ($images as $frame) {
                        $img = new \Imagick();
                        $img->readImageBlob($frame);
                        $img->thumbnailImage($width, $height, true);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                    }
                    $image->destroy();
                    $this->image = $canvas;
                } else {
                    $this->image->thumbnailImage($width, $height, true);
                }
                break;
            case 'scale_fill':
                $size = $this->image->getImagePage();
                $src_width = $size['width'];
                $src_height = $size['height'];

                $x = 0;
                $y = 0;

                $dst_width = $width;
                $dst_height = $height;

                if ($src_width * $height > $src_height * $width) {
                    $dst_height = intval($width * $src_height / $src_width);
                    $y = intval(($height - $dst_height) / 2);
                } else {
                    $dst_width = intval($height * $src_width / $src_height);
                    $x = intval(($width - $dst_width) / 2);
                }

                $image = $this->image;

                $color = 'rgba(' . $fill_color[0] . ',' . $fill_color[1] . ',' . $fill_color[2] . ',' . $fill_color[3] . ')';
                if ($this->type == 'gif') {
                    $images = $image->coalesceImages();
                    foreach ($images as $frame) {
                        /**@var \Imagick $frame */
                        $frame->thumbnailImage($width, $height, true);

                        $draw = new \ImagickDraw();
                        $draw->composite($frame->getImageCompose(), $x, $y, $dst_width, $dst_height, $frame);

                        $img = new \Imagick();
                        $img->newImage($width, $height, $color, 'gif');
                        $img->drawImage($draw);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                        $canvas->setImagePage($width, $height, 0, 0);
                    }
                } else {
                    $image->thumbnailImage($width, $height, true);

                    $draw = new \ImagickDraw();
                    $draw->composite($image->getImageCompose(), $x, $y, $dst_width, $dst_height, $image);

                    $canvas->newImage($width, $height, $color, $this->getType());
                    $canvas->drawImage($draw);
                    $canvas->setImagePage($width, $height, 0, 0);
                }
                $image->destroy();
                $this->image = $canvas;
                break;
            default:
                $size = $this->image->getImagePage();
                $src_width = $size['width'];
                $src_height = $size['height'];
                $crop_y = $crop_x = 0;
                $crop_w = $src_width;
                $crop_h = $src_height;
                if ($src_width * $height > $src_height * $width) {
                    $crop_w = intval($src_height * $width / $height);
                } else {
                    $crop_h = intval($src_width * $height / $width);
                }
                switch ($fit) {
                    case 'north_west':
                        $crop_x = 0;
                        $crop_y = 0;
                        break;
                    case 'north':
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = 0;
                        break;
                    case 'north_east':
                        $crop_x = $src_width - $crop_w;
                        $crop_y = 0;
                        break;
                    case 'west':
                        $crop_x = 0;
                        $crop_y = intval(($src_height - $crop_h) / 2);
                        break;
                    case 'center':
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = intval(($src_height - $crop_h) / 2);
                        break;
                    case 'east':
                        $crop_x = $src_width - $crop_w;
                        $crop_y = intval(($src_height - $crop_h) / 2);
                        break;
                    case 'south_west':
                        $crop_x = 0;
                        $crop_y = $src_height - $crop_h;
                        break;
                    case 'south':
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = $src_height - $crop_h;
                        break;
                    case 'south_east':
                        $crop_x = $src_width - $crop_w;
                        $crop_y = $src_height - $crop_h;
                        break;
                    default:
                        $crop_x = intval(($src_width - $crop_w) / 2);
                        $crop_y = intval(($src_height - $crop_h) / 2);
                }
                $image = $this->image;
                if ($this->type == 'gif') {
                    $images = $image->coalesceImages();
                    foreach ($images as $frame) {
                        $img = new \Imagick();
                        $img->readImageBlob($frame);
                        $img->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
                        $img->thumbnailImage($width, $height, true);

                        $canvas->addImage($img);
                        $canvas->setImageDelay($img->getImageDelay());
                        $canvas->setImagePage($width, $height, 0, 0);
                    }
                } else {
                    $image->cropImage($crop_w, $crop_h, $crop_x, $crop_y);
                    $image->thumbnailImage($width, $height, true);
                    $canvas->addImage($image);
                    $canvas->setImagePage($width, $height, 0, 0);
                }
                $image->destroy();
                $this->image = $canvas;
        }
        return $this;
    }
    /**
     * 添加水印图片
     *
     * @param     $path
     * @param int $x
     * @param int $y
     */
    public function addWatermark($path, $x = 0, $y = 0)
    {
        $watermark = new \Imagick($path);
        $draw = new \ImagickDraw();
        $draw->composite($watermark->getImageCompose(), $x, $y, $watermark->getImageWidth(), $watermark->getimageheight(), $watermark);

        if ($this->type == 'gif') {
            $image = $this->image;
            $canvas = new \Imagick();
            //$images = $image->coalesceImages();
            foreach ($image as $frame) {
                $img = new \Imagick();
                $img->readImageBlob($frame);
                $img->drawImage($draw);

                $canvas->addImage($img);
                $canvas->setImageDelay($img->getImageDelay());
            }
            $image->destroy();
            $this->image = $canvas;
        } else {
            $this->image->drawImage($draw);
        }
    }

    /**
     * 添加水印图片
     * @param $image
     * @param int $x
     * @param int $y
     */
    public function addWatermarkFromImage($image,$x = 0, $y = 0)
    {
        $watermark = $image->image;
        $draw = new \ImagickDraw();
        $draw->composite($watermark->getImageCompose(), $x, $y, $watermark->getImageWidth(), $watermark->getimageheight(), $watermark);

        if ($this->type == 'gif') {
            $image = $this->image;
            $canvas = new \Imagick();
            //$images = $image->coalesceImages();
            foreach ($image as $frame) {
                $img = new \Imagick();
                $img->readImageBlob($frame);
                $img->drawImage($draw);

                $canvas->addImage($img);
                $canvas->setImageDelay($img->getImageDelay());
            }
            $image->destroy();
            $this->image = $canvas;
        } else {
            $this->image->drawImage($draw);
        }
    }

    /**
     * 获取图片参数
     * @return array
     */
    public  function getImgParameter(){
        return $this->image->getImagePage();
    }

    /**
     * 添加水印文字
     *
     * @param       $text
     * @param int $x
     * @param int $y
     * @param int $angle
     * @param array $style
     */
    public function addText($text, $x = 0, $y = 0, $angle = 0, $style = array())
    {
        $draw = new \ImagickDraw();
        if (isset($style['font'])) {
            $draw->setFont($style['font']);
        }
        if (isset($style['font_size'])) {
            $draw->setFontSize($style['font_size']);
        }
        if (isset($style['fill_color'])) {
            $draw->setFillColor($style['fill_color']);
        }
        if(isset($style['font_alpha'])){
            $draw->setFillOpacity($style['font_alpha']);
        }
        if (isset($style['under_color'])) {
            $draw->setTextUnderColor($style['under_color']);
        }

        if ($this->type == 'gif') {
            foreach ($this->image as $frame) {
                /**@var \Imagick $frame */
                $frame->annotateImage($draw, $x, $y, $angle, $text);
            }
        } else {
            $draw->setGravity(\Imagick::GRAVITY_CENTER);
            //$draw->setTextAlignment(\Imagick::ALIGN_CENTER);
            $this->image->annotateImage($draw, $x, $y, $angle, $text);
        }
    }


    /**
     * 保存到指定路径
     *
     * @param $path
     *
     * @return bool
     */
    public function saveTo($path)
    {
        if ($this->type == 'gif') {
            return $this->image->writeImages($path, true);
        } else {
            return $this->image->writeImage($path);
        }
    }

    public function  destroy()
    {
        return $this->image->destroy();
    }
    /**
     * 输出图像
     *
     * @param bool $header
     */
    public function output($header = true)
    {
        ob_end_clean();
        if ($header) {
            header('Content-type: image/' . $this->type);
        }
        echo $this->image->getImagesBlob();
        exit(1);
    }

    public function getWidth()
    {
        $size = $this->image->getImagePage();
        return $size['width'];
    }

    public function getImageWidth(){
        return $this->image->getImageWidth();
    }

    public function getHeight()
    {
        $size = $this->image->getImagePage();
        return $size['height'];
    }
//    获取图像的x,y轴分辨率
    public function getImageResolution()
    {
        return  $this->image->getImageResolution();
    }
    public function getImageHeight(){
        return $this->image->getImageHeight();
    }

    /**
     * 设置图像类型， 默认与源类型一致
     *
     * @param string $type
     */
    public function setType($type = 'png')
    {
        $this->type = $type;
        $this->image->setImageFormat($type);
    }

    /**
     * 获取源图像类型
     *
     * @return null
     */
    public function getType()
    {
        return $this->type;
    }


    /**
     * 当前对象是否为图片
     *
     * @return bool
     */
    public function isImage()
    {
        return $this->image ? true : false;
    }


    /**
     * 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片
     *
     * @param int $width
     * @param int $height
     * @param bool $fit
     */
    public function thumbnail($width = 540, $height = 960, $fit = true)
    {//设置位深为8
        $this->image->setImageDepth(8);
        $parameter=$this->image->getImagePage();
        if($parameter['width']<$parameter['height']){
//           按照宽度缩略
            $this->image->thumbnailImage($width,$height*2, $fit);
        }else{
            //按高度缩略
            $this->image->thumbnailImage($width*2,$height, $fit);
        }

    }

    /**
     * 添加一个边框
     *
     * @param int $width 左右边框宽度
     * @param int $height 上下边框宽度
     * @param string $color 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'...
     */
    public function border($width, $height, $color = 'rgb(220, 220, 220)')
    {
        $color = new \ImagickPixel($color);
        //$color->setColor($color);
        $this->image->borderImage($color, $width, $height);
    }

    /**
     * 模糊
     *
     * @param $radius
     * @param $sigma
     */
    public function blur($radius, $sigma)
    {
        $this->image->blurImage($radius, $sigma);
    }

    /**
     * 高斯模糊
     *
     * @param $radius
     * @param $sigma
     */
    public function gaussianBlur($radius, $sigma)
    {
        $this->image->gaussianBlurImage($radius, $sigma);
    }

    /**
     * 运动模糊
     *
     * @param $radius
     * @param $sigma
     * @param $angle
     */
    public function motionBlur($radius, $sigma, $angle)
    {
        $this->image->motionBlurImage($radius, $sigma, $angle);
    }

    /**
     * 径向模糊
     *
     * @param $radius
     */
    public function radialBlur($radius)
    {
        $this->image->radialBlurImage($radius);
    }

    /**
     * 添加噪点
     *
     * @param null $type
     */
    public function addNoise($type = NULL)
    {
        $this->image->addNoiseImage($type == NULL ? \Imagick::NOISE_IMPULSE : $type);
    }

    /**
     * 调整色阶
     *
     * @param $black_point
     * @param $gamma
     * @param $white_point
     */
    public function level($black_point, $gamma, $white_point)
    {
        $this->image->levelImage($black_point, $gamma, $white_point);
    }

    /**
     * 调整亮度、饱和度、色调
     *
     * @param $brightness
     * @param $saturation
     * @param $hue
     */
    public function modulate($brightness, $saturation, $hue)
    {
        $this->image->modulateImage($brightness, $saturation, $hue);
    }

    /**
     * 素描
     *
     * @param $radius
     * @param $sigma
     */
    public function charcoal($radius, $sigma)
    {
        $this->image->charcoalImage($radius, $sigma);
    }

    public function swirlImage($degrees){
        $this->image->swirlImage($degrees);
    }

    /**
     * 油画效果
     *
     * @param $radius
     */
    public function oilPaint($radius)
    {
        $this->image->oilPaintImage($radius);
    }

    /**
     * 水平翻转
     */
    public function flop()
    {
        $this->image->flopImage();
    }

    /***
     * 波浪
     * @param $amplitude 振幅
     * @param $length  长度
     */
    function waveImage( $amplitude, $length)
    {
        $this->image->waveImage($amplitude, $length);
    }
    /**
     * 垂直翻转
     */
    public function flip()
    {
        $this->image->flipImage();
    }

    /***
     * 素描
     * @param $radius 半径
     * @param $sigma  标准差的高斯分布,以像素为单位
     * @param $angle  经度
     */
    function sketchImage($radius, $sigma, $angle) {
        $this->image->sketchimage($radius, $sigma, $angle);
    }

    /***
     * 油画
     * @param $radius
     */
    function oilPaintImage($radius) {
        $this->image->oilPaintImage($radius);
    }

    /***
     * 曝光
     * @param $threshold
     */
    function solarizeImage ($threshold) {
        $this->image->solarizeImage ($threshold);
    }

    /***
     * 马赛克
     */
    function mosaicImages  () {
        $this->image->mosaicImages  ();
    }
    /***
     * 颜色渲染
     * @param $color
     * @param $opacity
     */
    function colorizeImage( $color, $opacity) {
        $opacity = $opacity / 255.0;
        $opacityColor = new \ImagickPixel("rgba(0, 0, 0, $opacity)");
        $this->image->colorizeImage($color, $opacityColor);
    }
    /***
     * 彩色浮雕
     * @param $radius
     * @param $sigma
     */
    function embossImage( $radius, $sigma) {
        $this->image->embossImage($radius, $sigma);
    }

    /***
     * 增强的图像内的边缘
     * @param $radius
     */
    function edgeImage( $radius) {
        $this->image->edgeImage($radius);
    }
    /***
     * 老照片
     * @param $sepia
     */
    function sepiaToneImage($sepia) {
        $this->image->sepiaToneImage($sepia);
    }
    /**
     * 去掉图片的profile信息
     */
    public function stripImage()
    {
        $this->image->stripImage();
    }
    public function setCompressionQuality($quality)
    {
        $this->image->setCompressionQuality($quality);
    }
    /*
     * 去掉图片的profile信息
     *
     * @param string src_img 源图片路径
     * @return string src_img 图片名称 否则返回false
     */
    public function strip_profile($src_img,$dest_img = '')
    {
        if(!is_object($this->image))
        {
            return false;
        }
        try
        {
            $dest_img = empty($dest_img) ? $src_img : $dest_img;
            $this->image->readImage($src_img);
            $this->image->stripImage ();
            if($this->image->writeImage ($dest_img))
            {
                $this->destroy();
                return $src_img;
            }
            return false;
        }
        catch (\ImagickException $e)
        {
            return false;
        }
    }
    public function __destruct()
    {
        if ($this->image !== NULL) {
            $this->image->destroy();
        }
    }
    /**
     * 转换图片格式为jpg
     * @param $originalImage 原图地址
     * @param $outputImage   输出图片地址
     * @param $quality       图片质量
     * @return bool          成功返回true  失败false
     */
    function convert2jpg( $quality)
    {
        $originalImage=$this->originalImage;
        $exploded = explode('.', $originalImage);
        $ext = $exploded[count($exploded) - 1];
        if (preg_match('/jpg|jpeg/i', $ext))
            $imageTmp = imagecreatefromjpeg($originalImage);
        else if (preg_match('/png/i', $ext))
            $imageTmp = imagecreatefrompng($originalImage);
        else if (preg_match('/gif/i', $ext))
            $imageTmp = imagecreatefromgif($originalImage);
        else if (preg_match('/bmp/i', $ext))
            $imageTmp = imagecreatefrombmp($originalImage);
        else
            return false;
        imagejpeg($imageTmp, $this->outputImage, $quality);
        imagedestroy($imageTmp);
        return true;
    }

    /***
     * 旋转图像
     * @param $angle  角度
     * @param $color
     * @return $this
     */
    function rotateImage($angle, $color) {
        $this->image->rotateimage($color, $angle);
        return $this;
    }

    /***
     * 图片增强，改善嘈杂的图像质量
     * @return $this
     */
    function enhanceImage(){
        $this->image->enhanceImage();
        return $this;
    }

    function newImage($cols,$rows,$background,$format='png'){
        $this->image = new \Imagick();
        $this->image->newImage($cols , $rows , $background);
        $this->image->setImageFormat($format);
        $this->type = $format;
        return $this;
    }

    /***
     * 返回命名的图像属性
     * @param $name
     * @return string
     */
    public function getAttribute($name){
        return $this->image->getImageProperty($name);
    }

    /***
     * 碧绿
     * @param $name
     * @return string
     */
    public function aqua($name){
        return $this->image->getImageProperty($name);

        // 冲淡图像
        $this->image->modulateImage(100,0,100);
        $clut = new \Imagick();
        $clut->newPseudoImage(255,1,"gradient:darkblue-aqua");
        $this->image->clutImage($clut);
    }
    /**
     * 设置图片质量
     * @param $src_img
     * @param int $quality
     * @param string $dest_img
     * @return bool|string
     */
    public function set_quality($src_img,$quality = 70,$dest_img = '')
    {
        if(!is_object($this->image))
        {
            return false;
        }
        try
        {
            $dest_img = empty($dest_img) ? $src_img : $dest_img;
            $this->image->readImage($src_img);
            $image_mime = image_type_to_mime_type(exif_imagetype(file($src_img)));
            switch ($image_mime) {
                case "image/jpeg":
                    $this->image->setImageCompression(\Imagick::COMPRESSION_JPEG);
                    break;
                case "image/png":
                    $this->image->setImageCompression(\Imagick::COMPRESSION_UNDEFINED);
                    break;
            }
            $this->image->setImageCompressionQuality($quality);
            if($this->image->writeImage($dest_img))
            {
                $this->destory();
                return $dest_img;
            }
            return false;
        }
        catch (\ImagickException $e)
        {
            return false;
        }
    }

    /*
	 * 释放资源
	 *
	 */
    function destory()
    {
        if(is_object($this->image))
        {
            $this->image->clear();

            $this->image->destroy();
        }
    }
}